package pl.edu.pw.elka.jtrzasko.proz.warcaby.controller;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.concurrent.LinkedBlockingQueue;

import pl.edu.pw.elka.jtrzasko.proz.warcaby.messages.client.ClientMessage;

/**
 * Klasa odpowiada za odbior informacji od konkretnego klienta.
 * 
 */
public class ServerThread implements Runnable {
	/**
	 * Strumien do wysylania informacji od klienta
	 */
	private ObjectInputStream in;
	/**
	 * Strumien do odbierania informacji od klienta
	 */
	private ObjectOutputStream out;
	/**
	 * Kolejka do odbierania komunikatow od klienta
	 */
	private LinkedBlockingQueue<ClientMessage> clientMessagesQueue;

	/**
	 * Tworzy nowy dedykowany do konkretnego klienta serwer nasluchujacy
	 * 
	 * @param socket
	 *            Ganiazdo serwera glownego
	 * @param queue
	 *            Kolejka do wstawiania informacji od klienta
	 * @param server
	 *            Referencja na serwer glowny
	 */
	public ServerThread(Socket socket,
			LinkedBlockingQueue<ClientMessage> queue, Server server)
			throws IOException {
		this.clientMessagesQueue = queue;
		out = new ObjectOutputStream(socket.getOutputStream());
		out.flush();
		out.reset();
		in = new ObjectInputStream(socket.getInputStream());
		server.addClientOutStream(out);
	}

	public void run() {
		try {
			while (true) {
				ClientMessage m = (ClientMessage) in.readObject();
				try {
					clientMessagesQueue.put(m);
				} catch (InterruptedException e) {
					System.out.println("Unable to insert Message to queue");
				}
			}
		} catch (Throwable e) {
			out = null;
			System.out.println("Finished ServerThread");
		}
	}

}
